package com.example.kotlindemo.函数


fun addOne(x:Int): Int {
    return x+1
}
fun addOne(s:String):Int {
    return 10
}

//合并函数
fun <A,B,C> myCompose(f:(B)->C, g:(A)->B): (A)->C {// 一个范型函数，接收两个函数参数，返回一个函数
    return { x -> f(g(x)) } // 返回一个函数
}

fun isEven(x:Int) = 0==x%2 // 判断是否偶数
fun length(s:String) = s.length // 获取字符长度，它输出类型就是 isEven 的输入类型，因此可以将它的调用结果作为isEven 的参数


fun main(args:Array<String>){
    val values = listOf(1,3,5,7)
    println(values.map(::addOne)) // 1.函数引用

    val values2 = listOf("a","b","c")
    println(values2.map(::addOne)) // 2.函数引用重载

    //::addOne 真正类型其实是 （Int)->Int 或 (String)->Int。因此可以把一个函数引用赋给一个变量
    val ref1: (Int) -> Int = ::addOne // 引用第一个 addOne
    val ref2: (String) -> Int = ::addOne // 引用第二个 addOne
    val ref3:String.(Int)->Char = String::get // 引用 String 的 get(Int) 方法

    val f = myCompose(::isEven, ::length) // 得到一个 (A) -> C 到函数
    val strings = listOf("a","ab","abc")
    println(strings.map(f)) // 输出 false, true, false
    println(strings.filter(f)) // 输出 ab，长度为奇数的被过滤掉了

    Thread{
        println("test")
    }.start()


}
